from binance.enums import SIDE_SELL, SIDE_BUY, ORDER_TYPE_MARKET
from ConfigurationData import ConfigurationData




def check_and_close_position(client, symbol, profit_threshold):
    """
    检查并在盈利达到指定阈值时平仓。

    :param client: Binance客户端实例。
    :param symbol: 交易对符号。
    :param profit_threshold: 盈利阈值百分比。
    """
    try:
        # 获取您在指定交易对上的持仓信息
        position_info = client.futures_position_information(symbol=symbol)
        position = next((p for p in position_info if p['symbol'] == symbol), None)

        if position:
            position_amt = float(position['positionAmt'])
            entry_price = float(position['entryPrice'])  # 持仓的入场价格
            mark_price = float(position['markPrice'])    # 当前的标记价格

            # 计算盈利百分比
            profit_percent = ((mark_price - entry_price) / entry_price) * 100 if position_amt > 0 else ((entry_price - mark_price) / entry_price) * 100
            # 检查盈利是否超过指定阈值
            if profit_percent > profit_threshold:
                # 根据持仓类型选择平仓方向
                side = SIDE_SELL if position_amt > 0 else SIDE_BUY

                # 取消相关的止损单
                cancel_stop_loss_orders(client, symbol)

                # 创建市价平仓订单
                order = client.futures_create_order(
                    symbol=symbol,
                    side=side,
                    type=ORDER_TYPE_MARKET,
                    quantity=abs(position_amt)
                )
                #print("持仓已平仓:", order)
                print("持仓已平仓!")
            else:
                print(f"当前盈利 {profit_percent:.2f}% ，未达到平仓条件。")
        else:
            print("当前没有持有仓位。")

    except Exception as e:
        print("检查或平仓时发生错误:", e)




def cancel_stop_loss_orders(client, symbol):
    from ConfigurationData import ConfigurationData
    """
    取消与指定交易对相关的所有止损单。

    :param client: Binance客户端实例。
    :param symbol: 交易对符号。
    """
    try:
        # 获取与指定交易对相关的所有未完成订单
        orders = client.futures_get_open_orders(symbol=symbol)

        # 遍历所有订单
        for order in orders:
            # 不检查订单类型，直接取消所有订单
            client.futures_cancel_order(symbol=symbol, orderId=order['orderId'])
            print(f"已取消所有订单")
        ConfigurationData.successCount += 1
        print("下单成功了"+str(ConfigurationData.orderingCount)+"次"+"其中成功了"+str(ConfigurationData.successCount)+"次")

    except Exception as e:
        print("取消订单时发生错误:", e)
